<?php

// +----------------------------------------------------------------------

// | OneThink [ WE CAN DO IT JUST THINK IT ]

// +----------------------------------------------------------------------

// | Copyright (c) 2013 http://www.onethink.cn All rights reserved.

// +----------------------------------------------------------------------

// | Author: yangweijie <yangweijiester@gmail.com> <code-tech.diandian.com>

// +----------------------------------------------------------------------



namespace Common\Controller;



/**

 * 插件类

 * @author yangweijie <yangweijiester@gmail.com>

 */

abstract class Addon{

    /**

     * 视图实例对象

     * @var view

     * @access protected

     */

    protected $view = null;



    /**

     * $info = array(

     *  'name'=>'Editor',

     *  'title'=>'编辑器',

     *  'description'=>'用于增强整站长文本的输入和显示',

     *  'status'=>1,

     *  'author'=>'thinkphp',

     *  'version'=>'0.1'

     *  )

     */

    public $info                =   array();

    public $addon_path          =   '';

    public $config_file         =   '';

    public $custom_config       =   '';

    public $admin_list          =   array();

    public $custom_adminlist    =   '';

    public $access_url          =   array();



    public function __construct(){

        $this->view         =   \Think\Think::instance('Think\View');

        $this->addon_path   =   ONETHINK_ADDON_PATH.$this->getName().'/';

        $TMPL_PARSE_STRING = C('TMPL_PARSE_STRING');

        $TMPL_PARSE_STRING['__ADDONROOT__'] = __ROOT__ . '/Addons/'.$this->getName();

        C('TMPL_PARSE_STRING', $TMPL_PARSE_STRING);

        if(is_file($this->addon_path.'config.php')){

            $this->config_file = $this->addon_path.'config.php';

        }

    }



    /**

     * 模板主题设置

     * @access protected

     * @param string $theme 模版主题

     * @return Action

     */

    final protected function theme($theme){

        $this->view->theme($theme);

        return $this;

    }



    //显示方法

    final protected function display($template=''){

        if($template == '')

            $template = CONTROLLER_NAME;

        echo ($this->fetch($template));

    }



    /**

     * 模板变量赋值

     * @access protected

     * @param mixed $name 要显示的模板变量

     * @param mixed $value 变量的值

     * @return Action

     */

    final protected function assign($name,$value='') {

        $this->view->assign($name,$value);

        return $this;

    }





    //用于显示模板的方法

    final protected function fetch($templateFile = CONTROLLER_NAME){

        if(!is_file($templateFile)){

            $templateFile = $this->addon_path.$templateFile.C('TMPL_TEMPLATE_SUFFIX');

            if(!is_file($templateFile)){

                throw new \Exception("模板不存在:$templateFile");

            }

        }

        return $this->view->fetch($templateFile);

    }



    final public function getName(){

        $class = get_class($this);

        return substr($class,strrpos($class, '\\')+1, -5);

    }



    final public function checkInfo(){

        $info_check_keys = array('name','title','description','status','author','version');

        foreach ($info_check_keys as $value) {

            if(!array_key_exists($value, $this->info))

                return FALSE;

        }

        return TRUE;

    }



    /**

     * 获取插件的配置数组

     */

    final public function getConfig($name=''){

        static $_config = array();

        if(empty($name)){

            $name = $this->getName();

        }

        if(isset($_config[$name])){

            return $_config[$name];

        }

        $config =   array();

        $map['name']    =   $name;

        $map['status']  =   1;

        $config  =   M('Addons')->where($map)->getField('config');

        if($config){

            $config   =   json_decode($config, true);

        }else{

            $temp_arr = include $this->config_file;

            foreach ($temp_arr as $key => $value) {

                if($value['type'] == 'group'){

                    foreach ($value['options'] as $gkey => $gvalue) {

                        foreach ($gvalue['options'] as $ikey => $ivalue) {

                            $config[$ikey] = $ivalue['value'];

                        }

                    }

                }else{

                    $config[$key] = $temp_arr[$key]['value'];

                }

            }

        }

        $_config[$name]     =   $config;

        return $config;

    }



    //必须实现安装

    abstract public function install();



    //必须卸载插件方法

    abstract public function uninstall();

}

